package xmu.crms.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component;
import xmu.crms.entity.*;

import java.math.BigInteger;
import java.util.List;

/**
 * School Mapper
 * 注意，每个mapper要给其加上一个@Mapper的注解。
 * 且每个mapper都是接口，实现是由mybatis做的,不需要我们实现。
 *
 * @author YangKePiao
 * @date 2017/12/19
 */
@Mapper
@Component
public interface UserMapper {
    /**
     * selectUser.
     *
     * @param id
     * @return User deleteNumber
     * @author cb
     */
    User selectUser(BigInteger id);

    /**
     * selectSchool.
     *
     * @param id
     * @return School deleteNumber
     * @author cb
     */
    School selectSchool(BigInteger id);

    /**
     * selectClass.
     *
     * @param id
     * @return ClassInfo deleteNumber
     * @author cb
     */
    ClassInfo selectClass(BigInteger id);

    /**
     * selectCourse.
     *
     * @param id
     * @return Course deleteNumber
     * @author cb
     */
    Course selectCourse(BigInteger id);

    /**
     * selectSeminar.
     *
     * @param id
     * @return Seminar deleteNumber
     * @author cb
     */
    Seminar selectSeminar(BigInteger id);

    /**
     * 根据id得到用户
     * @param userId 用户id
     * @return 用户
     */
    User getUserByUserIdBigInteger(@Param("userId") BigInteger userId);

    /**
     * 返回签到序列
     * @param seminarId 讨论课id
     * @param classId 班级ID
     * @param userId 用户ID
     * @return 签到的序列
     */
    BigInteger getIdByInfo(@Param("classId") BigInteger classId, @Param("seminarId") BigInteger seminarId, @Param("userId")
            BigInteger userId);

    /**
     * 插入学生签到信息
     * @param classId 班级id
     * @param seminarId 讨论课id
     * @param userId 用户ID
     * @param attendanceStatus 签到状态
     */
    void insertAttendanceById(@Param("classId") BigInteger classId, @Param("seminarId") BigInteger seminarId, @Param("userId")
            BigInteger userId, @Param("status") BigInteger attendanceStatus);

    /**
     * 获取经度
     * @param seminarId 讨论课id
     * @param classId 班级id
     * @return 经度
     */
    double getLongitude(@Param("seminarId") BigInteger seminarId, @Param("classId") BigInteger classId);

    /**
     * 获取纬度
     * @param seminarId 讨论课id
     * @param classId 班级id
     * @return 纬度
     */
    double getLatitude(@Param("seminarId") BigInteger seminarId, @Param("classId") BigInteger classId);

    /**
     * 获取讨论课所在班级缺勤学生名单
     * @param seminarId 讨论课id
     * @param classId 班级id
     * @return 缺勤学生名单
     */
    List<User> listAbsenceStudent(@Param("seminarId") BigInteger seminarId, @Param("classId") BigInteger classId);

    /**
     * 获取学生签到信息.
     * @param seminarId 讨论课id
     * @param classId 班级id
     * @return 学生签到信息
     */
    List<Attendance> listAttendanceById(@Param("seminarId") BigInteger seminarId, @Param("classId") BigInteger classId);

    /**
     * 根据教师名称列出课程名称.
     * @param userName 用户名
     * @return 课程名单
     */
    List<Course> listCourseByTeacherName(@Param("userName") String userName);

    /**
     * 获取讨论课所在班级迟到学生名单.
     * @param seminarId 讨论课id
     * @param classId 班级id
     * @return 班级迟到学生名单
     */
    List<User> listLateStudent(@Param("seminarId") BigInteger seminarId, @Param("classId") BigInteger classId);

    /**
     * 获取讨论课所在的班级出勤的学生名单
     * @param seminarId 讨论课id
     * @param classId 班级id
     * @return 班级出勤的学生名单
     */
    List<User> listPresentStudent(@Param("seminarId") BigInteger seminarId, @Param("classId") BigInteger classId);

    /**
     * 按班级ID、学号开头、姓名开头获取学生列表.
     * @param classId 班级id
     * @param numBeginWith 学好开头
     * @param nameBeginWith 姓名开头
     * @return 学生列表
     */
    List<User> listUserByClassId(@Param("classId") BigInteger classId, @Param("numBeginWith") String numBeginWith, @Param("nameBeginWith") String nameBeginWith);

    /**
     * 根据用户名获取用户列表.
     * @param userName 用户名
     * @return 用户列表
     */
    List<User> listUserByUserName(@Param("userName") String userName);

    /**
     * 根据用户名获取用户ID.
     * @param userName 用户名
     * @return 用户id
     */
    List<BigInteger> listUserIdByUserName(@Param("userName") String userName);

    /**
     * 根据用户ID修改用户信息.
     * @param userId 用户id
     * @param user 用户对象
     */
    void updateUserByUserId(@Param("userId") BigInteger userId, @Param("user") User user);

    /**
     * 根据用户id获取学校id
     * @param userId 用户id
     * @return 学校id
     */
    BigInteger getSchoolIdByUserId(@Param("userId") BigInteger userId);

    /**
     * 根据学号或教工号获取用户
     * @param number 学号或教工号
     * @return 用户对象
     */
    User getUserByNumber(@Param("number") String number);

    /**
     * 根据手机号码获取用户
     * @param telephone 手机号码
     * @return 用户对象
     */
    User getUserByTelephone(@Param("telephone") String telephone);


    /**
     * 获取学生的签到状态
     *
     * @param studentId
     * @param classId
     * @param seminarId
     * @return
     */
    Attendance getStudentAttendanceByStudentIdAndClassIdAndSeminarId(@Param("studentId") BigInteger studentId,
                                                                     @Param("classId") BigInteger classId,
                                                                     @Param("seminarId") BigInteger seminarId);

    /**
     * 根据用户的id修改用户的头像文件名
     *
     * @param userId
     * @param avatarFileName
     * @return
     */
    Boolean updateUserAvatarByUserId(@Param("userId") BigInteger userId,@Param("avatar") String avatarFileName);
}
